<?php
/**
 * Created by PhpStorm.
 * User: ybjaa
 * Date: 2017/4/19
 * Time: 15:40
 *
 * 业务类的基类
 *
 */

namespace App\Business;


use App\Extend\UserIDInfo;
use App\Units;
use Illuminate\Support\Facades\Auth;

abstract class BusBase
{
    use UserIDInfo;
    static private $ArrayBusinesses;


    /**
     * @return string 获得所有基于此类所继承的子类的对象
     *
     * @return array 返回继承了业务基类的所有对象
     */
    static public function GetAllBusiness()
    {
        if(self::$ArrayBusinesses !=null && count(self::$ArrayBusinesses)>0)
        {
            return self::$ArrayBusinesses;
        }

        $array=Units::getFilePath(__DIR__);
        $prefix=(new \ReflectionClass(BusBase::class))->getNamespaceName();


        //映射为ReflectionClass对象
        $array=array_map(function ($a) use ($prefix) {
            return new \ReflectionClass($prefix.str_replace("//","\\",str_replace([__DIR__,".php"],"",$a)));
        },$array);

        //判断是否是业务类的子类以及非抽象类
        $array=array_filter($array,function(\ReflectionClass $a){
            return $a->isSubclassOf(BusBase::class) & !$a->isAbstract() ;
        });

        Self::$ArrayBusinesses=array_map(function(\ReflectionClass $a){
            return $a->newInstance();
        },$array);

        //获得允许扫描的业务类
        Self::$ArrayBusinesses=array_filter(Self::$ArrayBusinesses,function(BusBase $b){
            return $b->GetCheck();
        });

        return self::$ArrayBusinesses;

    }


    /**
     * 获得所有业务类的类名和GetBusinessName备注
     * @return array 以下数组集合
     * name:GetBusinessName备注;
     * className:类名
     */
    static public function GetAllBusinessClassNames()
    {
        $arrays=self::GetAllBusiness();
        if($arrays&&count($arrays)>0)
        {
            return array_map(function(BusBase $a){
                return ["name"=>$a->GetBusinessName(),
                    "className"=>$a->GetClassName()];
            },$arrays);
        }

    }


    /**
     * @var bool
     * true:加入权限扫描
     * false: 取消权限扫描
     */
    protected $_isCheck=true;



    /**
     * 检测字段是否为空，若不为空则返回trim的字段值
     *
     * @param $filed string 需要检测的字段
     * @return bool
     * true:不为空;
     * false:为空
     */
    protected function CheckFiledsIsNotNull(string &$filed)
    {
        if($filed===null) $filed="";
        $filed=trim($filed);
        if($filed ==="" ) return false;
        return true;
    }




    /**
     *
     * 关于业务操作的具体方法
     *
     */
    abstract protected function Handle();


    /**
     * 检测参数是否符合规则
     * @return ReturnResult 错误的话输出错误信息
     */
    protected function checkParameters()
    {
        return ReturnResult::Success();
    }


    /**
     * 权限检测
     *
     * @return boolean 是否通过权限检测
     */
    protected function PermissionCheck()
    {
        return true;
    }



    /**
     * 返回业务名称
     *
     * @return string 业务名称
     *
     */
    abstract public function GetBusinessName();


    /**
     *
     * 执行业务操作
     *
     */
    protected function ExcuteResult()
    {

        //判断参数
        $data=$this->checkParameters();

        if(!$data->result) return $data;


        //判断权限
        if(!$this->PermissionCheck())
        {
            return ReturnResult::Error(null,"权限不足");
        }


        //操作业务
        $data=$this->Handle();

        if($data===null)
        {
            ReturnResult::Error(null,"Null");
        }else if($data instanceof ReturnResult){

            return $data;
        }
        else if(array_key_exists("result",$data))
        {
            $result=$data["result"];
            $newdata=null;
            $message=null;
            if(array_key_exists("data",$data)) $newdata=$data["data"];
            if(array_key_exists("message",$data)) $message=$data["message"];
            return ReturnResult::DefineResult($result,$newdata,$message);
        }else
        {
            return ReturnResult::Success($data);
        }

    }


    /**
     * 执行业务操作
     * @param bool $isJson
     * @return ReturnResult|string
     */
    public function Excute($isJson=true)
    {
        if($isJson){
            return $this->ExcuteResult()->ToJson();
        }else{
            return $this->ExcuteResult();
        }
    }


    /**
     * 是否加入权限扫描
     * @return bool
     * true:加入权限扫描
     * false：取消权限扫描(若权限判定为false,则该业务无法获得通过)
     *
     */
    public function GetCheck()
    {
        return $this->_isCheck;
    }


    /**
     * 获得了业务类的类名
     * @return string 获得类名
     */
    public function GetClassName()
    {
        return static::class;
    }
}